//Copyright (c) 2009, Offbeat Guides
//All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are 
//permitted provided that the following conditions are met:
//
//* Redistributions of source code must retain the above copyright notice, this list of 
//conditions and the following disclaimer.
//
//* Redistributions in binary form must reproduce the above copyright notice, this list 
//of conditions and the following disclaimer in the documentation and/or other materials 
//provided with the distribution.
//
//* Neither the name of Offbeat Guides nor the names of its contributors may be used to 
//endorse or promote products derived from this software without specific prior written 
//permission.
//
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
//EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
//OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
//SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
//SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
//OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
//HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 
//TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
//EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

using System;
using System.Net;

namespace Amazon.Services
{
    /// <summary>
    /// Amazon EC2  Exception provides details of errors 
    /// returned by Amazon EC2  service
    /// </summary>
    public class AmazonException : Exception
    {
        #region Properties
        public HttpStatusCode StatusCode { get; private set; }

        /// <summary>
        /// Gets Request ID returned by the service if available.
        /// </summary>
        public String RequestId { get; private set; }
        #endregion

        #region Constructors and Finalizers
        /// <summary>
        /// Constructs AmazonEC2Exception with message
        /// </summary>
        /// <param name="message">Overview of error</param>
        public AmazonException(String message)
            : base(message) { }

        /// <summary>
        /// Constructs AmazonEC2Exception with message and status code
        /// </summary>
        /// <param name="message">Overview of error</param>
        /// <param name="statusCode">HTTP status code for error response</param>
        public AmazonException(String message, HttpStatusCode statusCode)
            : this(message)
        {
            this.StatusCode = statusCode;
        }


        /// <summary>
        /// Constructs AmazonEC2Exception with wrapped exception
        /// </summary>
        /// <param name="t">Wrapped exception</param>
        public AmazonException(Exception t)
            : base(t.Message, t) { }

        /// <summary>
        /// Constructs AmazonEC2Exception with wrapped exception
        /// </summary>
        /// <param name="t">Wrapped exception</param>
        public AmazonException(Exception t, HttpStatusCode status)
            : base(t.Message, t)
        {
            this.StatusCode = status;
        }

        /// <summary>
        /// Constructs AmazonEC2Exception with message and wrapped exception
        /// </summary>
        /// <param name="message">Overview of error</param>
        /// <param name="t">Wrapped exception</param>
        public AmazonException(String message, Exception t)
            : base(message, t)
        {
            AmazonException ex = t as AmazonException;
            if (ex != null)
                this.StatusCode = ex.StatusCode;
        }

        /// <summary>
        /// Constructs AmazonEC2Exception with information available from service
        /// </summary>
        /// <param name="message">Overview of error</param>
        /// <param name="statusCode">HTTP status code for error response</param>
        /// <param name="errorCode">Error Code returned by the service</param>
        /// <param name="errorType">Error type. Possible types:  Sender, Receiver or Unknown</param>
        /// <param name="requestId">Request ID returned by the service</param>
        /// <param name="xml">Compete xml found in response</param>
        public AmazonException(String requestId, String message, HttpStatusCode statusCode)
            : this(message, statusCode)
        {
            this.RequestId = requestId;
        }
        #endregion
    }
}
